package com.cnap.multiclouldmgmt.service;

import com.cnap.multiclouldmgmt.model.AccountInfo;
import com.cnap.multiclouldmgmt.model.RepByPage;
import com.cnap.multiclouldmgmt.model.flavor.FlavorInfo;
import com.cnap.multiclouldmgmt.model.gpu.FlavorGPUInfoWithImageDisk;
import com.cnap.multiclouldmgmt.model.k8sModels.*;
import com.cnap.multiclouldmgmt.model.microSvc.MicroServicePO;
import io.fabric8.kubernetes.client.KubernetesClient;

import java.util.List;
import java.util.Map;
/**
 * @author dyq
 * 基础服务
 */
public interface CacheService {

    /**
     *
     * @param k8sClusterIp
     * @param k8sClient
     */
    void putK8sClient(String k8sClusterIp, KubernetesClient k8sClient);

    /**
     *
     * @param k8sClusterIp
     * @return
     */
    KubernetesClient getK8sClient(String k8sClusterIp);

    /**
     *
     * @param k8sClusterIp
     */
    void removeK8sClient(String k8sClusterIp);

    /**
     *
     * @return
     */
    List<String> getK8sIps();

    /**
     *
     * @param k8sClusterName
     * @param k8sClusterBasicModel
     */
    void putK8sBasicModel(String k8sClusterName, K8sClusterBasicModel k8sClusterBasicModel);

    /**
     *
     * @param k8sClusterName
     * @return
     */
    K8sClusterBasicModel getK8sBasicModel(String k8sClusterName);

    /**
     *
     * @param k8sClusterName
     * @param podModelMap
     */
    void putK8sPodModels(String k8sClusterName, Map<String,List<PodModel>> podModelMap);

    /**
     * @param userName
     * @param k8sClusterName
     * @return
     */
    List<PodModel> getK8sPodModels(String userName,String k8sClusterName);

    /**
     * 
     * @param svcId
     */
    void putVmCreateSvc(String svcId);

    /**
     *
     * @param svcId
     * @return
     */
    long getVmCreateTime(String svcId);

    /**
     *
     * @param svcId
     */
    void delVmCreate(String svcId);

    /**
     *
     * @return
     */
    List<String> getAllVmCreateSvcId();

    /**
     * 放置node信息缓存
     * @param createUser
     * @param nodeModelRepByPage
     */
    void putK8sNodeInfo(String createUser, RepByPage<NodeModel> nodeModelRepByPage);

    /**
     * 清除缓存
     * @param createUser
     * @param clusterName
     */
    void clearK8sInfoCache(String createUser, String clusterName);

    /**
     * 清除所有缓存
     */
    void clearAllK8sInfoCache();

    /**
     * 获取缓存信息
     * @param createUser
     */
    List<RepByPage<NodeModel>> getK8sNodeInfo(String createUser);

    /**
     * add ns cace
     * @param createUser
     * @param nameSpaceModelRepByPage
     */
    void putK8sNsInfo(String createUser, RepByPage<NameSpaceModel> nameSpaceModelRepByPage);

    /**
     *
     * @param createUser
     * @return
     */
    List<RepByPage<NameSpaceModel>> getK8sNsInfo(String createUser);

    /**
     *
     * @param createUser
     * @param workLoadModelRepByPage
     */
    void putK8sWorkLoadInfo(String createUser, RepByPage<WorkLoadModel> workLoadModelRepByPage);

    /**
     *
     * @param createUser
     * @return
     */
    List<RepByPage<WorkLoadModel>> getK8sWorkLoadInfo(String createUser);

    /**
     *
     * @param createUser
     * @param podModelRepByPage
     */
    void putK8sPodInfo(String createUser, RepByPage<PodModel> podModelRepByPage);

    /**
     *
     * @param createUser
     * @return
     */
    List<RepByPage<PodModel>> getK8sPodInfo(String createUser);

    /**
     *
     * @param createUser
     * @param svcModelRepByPage
     */
    void putK8sSvcInfo(String createUser, RepByPage<SvcModel> svcModelRepByPage);

    /**
     *
     * @param createUser
     * @return
     */
    List<RepByPage<SvcModel>> getK8sSvcInfo(String createUser);

    /**
     *
     * @param createUser
     * @param k8sClusterName
     * @return
     */
    RepByPage<NodeModel> getK8sNodeInfoByClusterName(String createUser, String k8sClusterName);

    void putFlavorInfo(String key, FlavorInfo flavorInfo);

    FlavorInfo getFlavorInfo(String key);

    /**
     * 获取所有缓存中的用户
     * @return
     */
    List<String> getAllK8sUser();

    /**
     * 获取一个用户所有被缓存的集群名
     * @param userName
     * @return
     */
    List<String> getK8sClusterNames(String userName);

    /**
     * 放入集群信息
     * @param createUser
     * @param k8sClusterModel
     */
    void putK8sClusterModels(String createUser, K8sClusterModel k8sClusterModel);


    /**
     * 获取所有的集群信息
     * @param createUser
     * @return
     */
    List<K8sClusterModel> getAllK8sClusterModels(String createUser);

    /**
     * 清除所有microsvc缓存
     */
    void cleanAllMicroSvcCache();

    /**
     * 放置缓存
     * @param userName
     * @param microServicePO
     */
    void putMicroSvc(String userName, MicroServicePO microServicePO);

    /**
     * 获取参数
     * @param userName
     * @param serviceName
     * @return
     */
    MicroServicePO getMicroSvc(String userName,String serviceName);

    /**
     *
     * @param ipSvcName
     * @param svcModel
     */
    void putSvcModelForMicroSvc(String ipSvcName, SvcModel svcModel);

    /**
     *
     * @param ipSvcName
     * @return
     */
    SvcModel getSvcModelByIpSvcName(String ipSvcName);

    /**
     * 获取所有和微服务绑定的svc
     * @return
     */
    List<SvcModel> getSvcModelsForMicroSvc();

    /**
     * 需要中断的svc（因为删除应用）
     * @param svcId
     */
    void putStopVmCreateSvc(String svcId);

    /**
     * 确定这个svcId要不要停止
     * @param svcId
     * @return
     */
    boolean checkSvcIdWhetherStop(String svcId);

    /**
     * 流程停止之后，去掉这个svcId
     * @param svcId
     * @return
     */
    void removeStopSvcId(String svcId);

    void putGpuFlavorInfo(String key, FlavorGPUInfoWithImageDisk flavorGPUInfoWithImageDisk);

    FlavorGPUInfoWithImageDisk getGpuFlavorInfo(String key);

    AccountInfo getAccountNameByNetName(String getvNetName);
}
